﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;




class car
{
public:
	virtual void drive() = 0;
};
class benz :public car
{
public:
	virtual void drive()
	{
		cout << "benz-舒适" << endl;
	}
};
class bmw :public car
{
public:
	virtual void drive()
	{
		cout << "bmw-操控" << endl;
	}
};
int main()
{
	// 编译报错：error c2259: “car”: ⽆法实例化抽象类 
	car car;
	car* pbenz = new benz;
	pbenz->drive();
	car* pbmw = new bmw;
	pbmw->drive();
	return 0;
}


//class Person {
	//public:
	//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
	//};
	//class Student : public Person {
	//public:
	//	virtual void BuyTicket() { cout << "买票-打折" << endl; }
	//};
	//class Soldier : public Person {
	//public:
	//	virtual void BuyTicket() { cout << "买票-优先" << endl; }
	//};
	//void Func(Person* ptr)
	//{
	//
	//	ptr->BuyTicket();
	//}
	//int main()
	//{
	//
	//	Person ps;
	//	Student st;
	//	Soldier sr;
	//	Func(&ps);
	//	Func(&st);
	//	Func(&sr);
	//
	//	return 0;
	//}

//template<class K>
//struct BSTNode
//{
//	K _key;
//	BSTNode<K>* _left;
//	BSTNode<K>* _right;
//	BSTNode(const K& key)
//		:_key(key)
//		, _left(nullptr)
//		, _right(nullptr)
//	{}
//};
//// Binary Search Tree
//template<class K>
//class BSTree
//{
//	typedef BSTNode<K> Node;
//public:
//	bool Insert(const K& key)
//	{
//		if (_root == nullptr)
//		{
//			_root = new Node(key);
//			return true;
//		}
//		Node* parent = nullptr;
//		Node* cur = _root;
//		while (cur)
//		{
//			if (cur->_key < key)
//			{
//				parent = cur;
//				cur = cur->_right;
//			}
//			else if (cur->_key > key)
//			{
//				parent = cur;
//				cur = cur->_left;
//			}
//			else
//			{
//				return false;
//			}
//		}
//		cur = new Node(key);
//		if (parent->_key < key)
//		{
//			parent->_right = cur;
//		}
//		else
//		{
//			parent->_left = cur;
//		}
//		return true;
//	}
//	bool Find(const K& key)
//	{
//		Node* cur = _root;
//		while (cur)
//		{
//			if (cur->_key < key)
//			{
//				cur = cur->_right;
//			}
//			else if (cur->_key > key)
//			{
//				cur = cur->_left;
//			}
//			else
//			{
//				return true;
//			}
//		}
//		return false;
//	}
//	bool Erase(const K& key)
//	{
//		Node* parent = nullptr;
//		Node* cur = _root;
//		while (cur)
//		{
//			if (cur->_key < key)
//			{
//				parent = cur;
//				cur = cur->_right;
//			}
//			else if (cur->_key > key)
//			{
//				parent = cur;
//				cur = cur->_left;
//			}
//			else
//			{
//				// 0-1个孩⼦的情况 
//				// 删除情况1 2 3均可以直接删除，改变⽗亲对应孩⼦指针
//				//指向即可
//					if (cur->_left == nullptr)
//					{
//						if (parent == nullptr)
//						{
//							_root = cur->_right;
//						}
//						else
//						{
//							if (parent->_left == cur)
//								parent->_left = cur -> _right;
//							else
//								parent->_right = cur -> _right;
//						}
//						delete cur;
//						return true;
//					}
//					else if (cur->_right == nullptr)
//					{
//						if (parent == nullptr)
//						{
//							_root = cur->_left;
//						}
//						else
//						{
//							if (parent->_left == cur)
//								parent->_left = cur -> _left;
//							else
//								parent->_right = cur -> _left;
//						}
//						delete cur;
//						return true;
//					}
//					else
//					{
//						// 2个孩⼦的情况 
//						// 删除情况4，替换法删除 
//						// 假设这⾥我们取右⼦树的最⼩结点作为替代结点
//						//去删除
//							// 这⾥尤其要注意右⼦树的根就是最⼩情况的情况
//							//的处理，对应课件图中删除8的情况
//							// ⼀定要把cur给rightMinP，否会报错。 
//							Node* rightMinP = cur;
//						Node* rightMin = cur->_right;
//						while (rightMin->_left)
//						{
//							rightMinP = rightMin;
//							rightMin = rightMin->_left;
//						}
//						cur->_key = rightMin->_key;
//						if (rightMinP->_left == rightMin)
//							rightMinP->_left = rightMin -> _right;
//						else
//							rightMinP->_right = rightMin -> _right;
//						delete rightMin;
//						return true;
//					}
//			}
//		}
//		return false;
//	}
//	void InOrder()
//	{
//		_InOrder(_root);
//		cout << endl;
//	}
//private:
//	void _InOrder(Node* root)
//	{
//		if (root == nullptr)
//		{
//			return;
//		}
//		_InOrder(root->_left);
//		cout << root->_key << " ";
//		_InOrder(root->_right);
//	}
//private:
//	Node* _root = nullptr;
//};
